﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using skhukb.DB;

namespace skhukb.Tests
{
    public class DB
    {
        //// 사용자
        public static bool 사용자_존재하나(string 아이디)
        {
            using (var db = new DBDataContext())
                return db.사용자.Any(p => p.로그인ID == 아이디);
        }

        public static void 비밀번호_수정(string 아이디, string 비밀번호)
        {
            using (var db = new DBDataContext()) {
                var n = db.사용자.First(p => p.로그인ID == 아이디);
                n.비밀번호 = 비밀번호;
                db.SubmitChanges();
            }
        }

        public static bool 비밀번호_일치하나(string 아이디, string 비밀번호)
        {
            using (var db = new DBDataContext()) {
                var n = db.사용자.First(p => p.로그인ID == 아이디);
                return n.비밀번호 == 비밀번호;
            }
        }

        //// 글
        public static int 글수(long 주제ID)
        {
            using (var db = new DBDataContext())
                return db.글.Count(p => p.주제ID == 주제ID);
        }

        public static long 새글ID()
        {
            using (var db = new DBDataContext())
                return db.글.OrderByDescending(p => p.ID).First().ID;
        }

        public static bool 글확인(long 글ID, string 제목 = null, string 내용 = null, int? 코드 = null, long? 주제ID = null, int? 순서 = null, int? 상태 = null, string 작성자명 = null, string 편집유형 = null, bool 전산소만 = false)
        {
            using (var db = new DBDataContext()) {
                var n = db.글.Single(p => p.ID == 글ID);
                return  (코드 == null || n.코드 == 코드) &&
                        (주제ID == null || n.주제ID == 주제ID) && 
                        (순서 == null ||  n.순서 == 순서) && 
                        (제목 == null || n.제목 == 제목) && 
                        (내용 == null || n.내용 == 내용) && 
                        DateTime.Now.Subtract(n.생성일).Minutes < 3 && 
                        (작성자명 == null || n.사용자.이름 == 작성자명) && 
                        (편집유형 == null || n.편집유형 == 편집유형) && 
                        (상태 == null || n.상태 == 상태) && 
                        (전산소만 == false || n.전산소만 == 전산소만);
            }
        }

        // 주제
        public static long 새주제ID()
        {
            using (var db = new DBDataContext())
                return db.주제.OrderByDescending(p => p.ID).First().ID;
        }

        public static long 새주제편집ID()
        {
            using (var db = new DBDataContext())
                return db.주제편집.OrderByDescending(p => p.ID).First().ID;
        }

        public static int 주제편집내역수(long 주제ID, string 편집유형)
        {
            using (var db = new DBDataContext())
                return db.주제편집.Count(p => p.주제ID == 주제ID && p.편집유형 == 편집유형);
        }

        public static bool 주제확인(long 주제ID, string 제목 = null, string 총제목 = null, bool? 제거 = null)
        {
            using (var db = new DBDataContext()) {
                var n = db.주제.Single(p => p.ID == 주제ID);
                return (제목 == null || n.제목 == 제목) &&
                       (총제목 == null || n.총제목 == 총제목) &&
                       (제거 == null || n.제거 == 제거);
            }
        }

        public static bool 주제편집확인(long 주제편집ID, long? 주제ID, string 편집유형, string 편집자명)
        {
            using (var db = new DBDataContext()) {
                var n = db.주제편집.Single(p => p.ID == 주제편집ID);
                return (주제ID == null || n.주제ID == 주제ID) &&
                       (편집유형 == null || n.편집유형 == 편집유형) &&
                       (편집자명 == null || n.사용자.이름 == 편집자명);
            }
        }

        public static bool 글이동주제편집내역확인(string 편집자명, long 주제1ID, long 주제2ID)
        {
            using (var db = new DBDataContext()) {
                var list = db.주제편집.OrderByDescending(p => p.ID).Take(2).ToList();
                if (list.ElementAt(0).주제ID != 주제1ID) return false;
                if (list.ElementAt(1).주제ID != 주제2ID) return false;
                return list.All(p => p.사용자.이름 == 편집자명 && p.편집유형 == BL.Consts.글이동 && DateTime.Now.Subtract(p.편집일).Minutes < 3);
            }
        }

        public static int 새코드(long 주제ID)
        {
            using (var db = new DBDataContext()) {
                var 주제 = db.주제.Single(p => p.ID == 주제ID);
                return (주제.글.Count() == 0) ? 1 : 1 + 주제.글.Max(p => p.코드);
            }
        }


    }
}
